<?php 
namespace Lib\Model;
use Lib\ResLoader,
    Doctrine\ORM\EntityManager;
/**
 * Base class for models
 *
 * @since 23 июня 2010
 * @author diotheos
 */
class DoctrineManager{

    /**
     * @var $_em \Doctrine\ORM\EntityManager
     */
	protected $_em;
	
	protected $_defaultEntityName;
	
	/**
	 * Function description
	 * 
	 * @since 23 июня 2010
	 * @author diotheos
	 * @return void
	 */
	public function __construct(){
		$this->_em = $this->getEntityManager();
	}

	/**  
	 * Gets Entity manager
	 * @since 23 июня 2010
	 * @author diotheos
	 * @return Doctrine\ORM\EntityManager
	 */
	public function getEntityManager(){
		$entityManager = ($this->_em instanceof \Doctrine\ORM\EntityManager)? $this->_em: ResLoader::getResource('Doctrine2');
		$this->setEntityManager($entityManager);
		return $this->_em;
	}
    /**
     * Sets Entity manager
     * 
     * @since 23 июня 2010
     * @author diotheos
     * @return Lib_Model_Doctrine
     */
    public function setEntityManager(\Doctrine\ORM\EntityManager $em){
    	$this->_em = $em;
        return $this;
    }
    /**
     * Function description
     * 
     * @since 23 июня 2010
     * @author diotheos
     * @return Doctrine\ORM\EntityRepository
     */
    public function getEntity($entityName){
    	return $this->_em->getRepository($entityName);
    }
    
    /**
     * Function description
     * 
     * @since 23 июня 2010
     * @author diotheos
     * @param String $entityName
     * @return Lib_Model_Doctrine
     */
    public function setDefaultEntity($entityName){
    	$this->_defaultEntityName = $entityName;
    	return $this;
    }
    
    /**
     * Function description
     * 
     * @since 23 июня 2010
     * @author diotheos
     * @return \Doctrine\ORM\EntityRepository
     */
    public function getDefaultEntity(){
    	return $this->getEntity($this->getDefaultEntityName());
    }
    /**
     * Function description
     * 
     * @since 23 июня 2010
     * @author diotheos
     * @return string
     */
    public function getDefaultEntityName(){
    	return $this->_defaultEntityName;
    }

    /**
     * Get specified items builder
     * @param mixed $ids
     * @return \Doctrine\ORM\QueryBuilder
     */
    public function getItemsQuery($entityTable, $ids = null){
        $qb = $this->getEntityManager()
                ->createQueryBuilder()
                ->select('e')
                ->from($entityTable, 'e');
        if($ids !== null){
            $condition = (is_array($ids))?(count($ids)?$qb->expr()->in('e.id', $ids):null):$qb->expr()->eq('e.id', $ids);
            if (null !== $condition){
                $qb->where($condition);
            }
        }
        return $qb;
    }

    /**
     * Function description
     * AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA БЛЯЯЯЯ, хоть десь використовується стільки аргументів?
     * @return mixed
     */
    public function getItems($entityTable, $ids = null, $asArray = false, $resultCache = 360, $queryCache = true,  $withField = null, $withValue= null) {
        $items = $this->getItemsQuery($entityTable, $ids);
        if(null !== $withField){
            $items = $items->andWhere('u.'.$withField.' = :fieldVal');
            $items->setParameter('fieldVal', $withValue);
        }
        $items = $items->getQuery();

        $items->useQueryCache($queryCache);

        if($resultCache){
            $items = $items->useResultCache(true, $resultCache);
        } else {
            $items = $items->useResultCache(false);
        }
        if($asArray){
            return $items->getArrayResult();
        } else {
            return $items->getResult();
        }
    }
    
    /**
     *
     * @param <type> $entityTable
     * @param <type> $ids
     * @param <type> $asArray
     * @param <type> $resultCache
     * @param <type> $queryCache
     * @return <type> 
     */
    public function getEnabledItems($entityTable, $ids = null, $asArray = false, $resultCache = 360, $queryCache = true){
        return $this->getItems($entityTable, $ids, $asArray, $resultCache, $queryCache, 'enabled', true);
    }
    
    /**
     *
     * @param <type> $entityTable
     * @param <type> $ids
     * @param <type> $asArray
     * @param <type> $resultCache
     * @param <type> $queryCache
     * @return <type> 
     */
    public function getDisabledItems($entityTable, $ids = null, $asArray = false, $resultCache = 360, $queryCache = true){
        return $this->getItems($entityTable, $ids, $asArray, $resultCache, $queryCache, 'enabled', false);
    }
    
    

/**
     * Function description
     *
     * @return void
     */
    public function free($entityName) {
        $this->getEntityManager()->clear($entityName);
    }
}